package com.ww.java.generic.method.bound;

import java.awt.Color;

/**
 * 因为擦除移除了类型信息，所以，可以用无界泛型参数调用的方法只是那些可以用Object调用的方法，
 * 但是，如果能够将这个参数限制为某个类型子集，那么你就可以用这些类型子集来调用方法，为了执行
 * 这种限制，Java泛型重用了extends关键字。
 */
public class BasicBounds {
	
	public static void main(String[] args) {
		Solid<Bounded> solid = new Solid<>(new Bounded());
		solid.color();
		solid.getY();
		solid.weight();
	}
}

interface HasColor {
	
	Color getColor();
}

class Colored<T extends HasColor> {
	
	T item;
	
	Colored(T item) {
		this.item = item;
	}
	
	T getItem() {
		return item;
	}
	
	Color color() {
		return item.getColor();
	}
}

class Dimension {
	
	public int x, y, z;
}

/**
 * 多边界
 * 类必须放在前边，然后是接口，不然会报错
 * @param <T>
 */
class ColoredDimension<T extends Dimension & HasColor> {
	
	T item;
	
	public ColoredDimension(T item) {
		this.item = item;
	}
	
	T getItem() {
		return item;
	}
	
	Color color() {
		return item.getColor();
	}
	
	int getX() {
		return item.x;
	}
	
	int getY() {
		return item.y;
	}
	
	int getZ() {
		return item.z;
	}
}

interface Weight { int weight(); }

class Solid<T extends Dimension & HasColor & Weight> {
	
	T item;
	
	Solid(T item) {
		this.item = item;
	}
	
	T getItem() {
		return item;
	}
	
	Color color() {
		return item.getColor();
	}
	
	int getX() {
		return item.x;
	}
	
	int getY() {
		return item.y;
	}
	
	int getZ() {
		return item.z;
	}
	
	int weight() {
		return item.weight();
	}
}

class Bounded extends Dimension implements HasColor, Weight {
	
	public Color getColor() {
		return null;
	}
	
	public int weight() {
		return 0;
	}
}